@@ -1,3 +1,13 @@
+0.34001 Mon May 16, 2011
+ Fiz another memory cycle using Select field
+ Tweak code creating results for Field testing
+
+0.34000 Mon May 16, 2011
+ Fixed memory cycles; 1 in HFH code, others by requiring Moose 2.0007
+ Localize value of a button
+ Allow limited use of has_many multiple select
+ Add SimpleInline & TableInline widgets to not wrap compound fields
+
0.33002 Tues Feb 22, 2011
Accidentally left off compatibility for 'required_message' attribute
messages => { required => '...' } is new style and worked
@@ -116,7 +116,9 @@ lib/HTML/FormHandler/Widget/Wrapper/Base.pm
lib/HTML/FormHandler/Widget/Wrapper/Fieldset.pm
lib/HTML/FormHandler/Widget/Wrapper/None.pm
lib/HTML/FormHandler/Widget/Wrapper/Simple.pm
+lib/HTML/FormHandler/Widget/Wrapper/SimpleInline.pm
lib/HTML/FormHandler/Widget/Wrapper/Table.pm
+lib/HTML/FormHandler/Widget/Wrapper/TableInline.pm
lib/HTML/FormHandler/Wizard.pm
share/templates/form.tt
share/templates/widget/button.tt
@@ -136,6 +138,7 @@ share/templates/widget/textarea.tt
share/templates/widget/upload.tt
t/01app.t
t/build_id.t
+t/circular_refs.t
t/composed.t
t/compound_field.t
t/constraints.t
@@ -188,6 +191,7 @@ t/render_result.t
t/render_table.t
t/render_widgets.t
t/render_withtt.t
+t/rep_nest.t
t/reprender.t
t/req_message.t
t/result.t
@@ -4,7 +4,7 @@
"FormHandler Contributors - see HTML::FormHandler"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 4.102342, CPAN::Meta::Converter version 2.101670",
+ "generated_by" : "Dist::Zilla version 4.200006, CPAN::Meta::Converter version 2.101670",
"license" : [
"perl_5"
],
@@ -16,7 +16,7 @@
"prereqs" : {
"configure" : {
"requires" : {
- "ExtUtils::MakeMaker" : "6.31",
+ "ExtUtils::MakeMaker" : "6.30",
"File::ShareDir::Install" : "0.03"
}
},
@@ -29,7 +29,7 @@
"File::ShareDir" : 0,
"File::Spec" : 0,
"Locale::Maketext" : "1.09",
- "Moose" : "0.90",
+ "Moose" : "2.0007",
"MooseX::Getopt" : "0.16",
"MooseX::Types" : "0.20",
"MooseX::Types::Common" : 0,
@@ -42,6 +42,7 @@
"requires" : {
"Test::Differences" : 0,
"Test::Exception" : 0,
+ "Test::Memory::Cycle" : "1.04",
"Test::More" : "0.94"
}
}
@@ -58,6 +59,6 @@
"web" : "http://github.com/gshank/html-formhandler"
}
},
- "version" : "0.33002"
+ "version" : "0.34001"
}
@@ -5,12 +5,13 @@ author:
build_requires:
Test::Differences: 0
Test::Exception: 0
+ Test::Memory::Cycle: 1.04
Test::More: 0.94
configure_requires:
- ExtUtils::MakeMaker: 6.31
+ ExtUtils::MakeMaker: 6.30
File::ShareDir::Install: 0.03
dynamic_config: 0
-generated_by: 'Dist::Zilla version 4.102342, CPAN::Meta::Converter version 2.101670'
+generated_by: 'Dist::Zilla version 4.200006, CPAN::Meta::Converter version 2.101670'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -24,7 +25,7 @@ requires:
File::ShareDir: 0
File::Spec: 0
Locale::Maketext: 1.09
- Moose: 0.90
+ Moose: 2.0007
MooseX::Getopt: 0.16
MooseX::Types: 0.20
MooseX::Types::Common: 0
@@ -34,4 +35,4 @@ requires:
resources:
bugtracker: https://rt.cpan.org/Public/Dist/Display.html?Name=HTML-FormHandler
repository: git://github.com/gshank/html-formhandler.git
-version: 0.33002
+version: 0.34001
@@ -4,7 +4,7 @@ use warnings;
-use ExtUtils::MakeMaker 6.31;
+use ExtUtils::MakeMaker 6.30;
use File::ShareDir::Install;
install_share dist => "share";
@@ -16,10 +16,11 @@ my %WriteMakefileArgs = (
'BUILD_REQUIRES' => {
'Test::Differences' => '0',
'Test::Exception' => '0',
+ 'Test::Memory::Cycle' => '1.04',
'Test::More' => '0.94'
},
'CONFIGURE_REQUIRES' => {
- 'ExtUtils::MakeMaker' => '6.31',
+ 'ExtUtils::MakeMaker' => '6.30',
'File::ShareDir::Install' => '0.03'
},
'DISTNAME' => 'HTML-FormHandler',
@@ -34,7 +35,7 @@ my %WriteMakefileArgs = (
'File::ShareDir' => '0',
'File::Spec' => '0',
'Locale::Maketext' => '1.09',
- 'Moose' => '0.90',
+ 'Moose' => '2.0007',
'MooseX::Getopt' => '0.16',
'MooseX::Types' => '0.20',
'MooseX::Types::Common' => '0',
@@ -42,7 +43,7 @@ my %WriteMakefileArgs = (
'aliased' => '0',
'namespace::autoclean' => '0.09'
},
- 'VERSION' => '0.33002',
+ 'VERSION' => '0.34001',
'test' => {
'TESTS' => 't/*.t'
}
@@ -1,7 +1,7 @@
This archive contains the distribution HTML-FormHandler,
-version 0.33002:
+version 0.34001:
HTML forms using Moose
@@ -14,125 +14,127 @@ not run its Makefile.PL or Build.PL.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
-SHA1 d14e8e9fc6fbac183e1d1fddc14a956fcf4b74d1 Changes
+SHA1 5ca5696da88d5612177ebb5c399d6e3ee1f29c84 Changes
SHA1 2972c49b6d6e4d8bcc3360a734ee629ac16c6d8c INSTALL
SHA1 2f0045ac3d6d539f73a61360de049b2f7fe349d0 LICENSE
-SHA1 3720844e257bc36d4166e365dd783796c8563b4d MANIFEST
-SHA1 335e0e47a8d209732120387a76938c0d6a54e649 META.json
-SHA1 675a79e8ee1cb443123e872b9a581b63cbb702a0 META.yml
-SHA1 4269d0e8c8aa7855ed616ef598b95907018b8cf6 Makefile.PL
-SHA1 33f7e434cad928d29cd8e4334933a77f8d545a84 README
-SHA1 9c75a76544c78425259a49fd974062c1a0513ffc TODO
-SHA1 0547dd36c3eb4d8c89a04b656aac51c4318e989c dist.ini
-SHA1 c0f378323095e6268714d3b43aaf09db546bdd19 lib/HTML/FormHandler.pm
-SHA1 3fba61d0857c99fe60a0fda24808d3d955830b58 lib/HTML/FormHandler/Base.pm
-SHA1 55428f2c4e0990373508f8b3e37f7dc06f4b6f63 lib/HTML/FormHandler/BuildFields.pm
-SHA1 cb3842019ca5156843095a7214f34d9ac9794339 lib/HTML/FormHandler/BuildPages.pm
-SHA1 f83ecfccbe31f7a82fb6ee27e800f39870b517f7 lib/HTML/FormHandler/Field.pm
-SHA1 32dc7e1bb76025afc7a8255caa640efe74153ad2 lib/HTML/FormHandler/Field/Boolean.pm
-SHA1 b099c34e6aabb5e2aa37aca032e6f31ca287f953 lib/HTML/FormHandler/Field/Button.pm
-SHA1 0873c6b08b04c881b495deeb0090fbda3c3fc5e7 lib/HTML/FormHandler/Field/Captcha.pm
-SHA1 699cdaf5fab16ab87c9927cfce96db25be75b1c9 lib/HTML/FormHandler/Field/Checkbox.pm
-SHA1 168aac94fde66240c2b517f21de58204fac74c4d lib/HTML/FormHandler/Field/Compound.pm
-SHA1 32fa5eb9602833e53ef5e6e37618bc4b6f5a88a4 lib/HTML/FormHandler/Field/Date.pm
-SHA1 ac61babbcdf691c1ccf94fe913579730e54b3de7 lib/HTML/FormHandler/Field/DateMDY.pm
-SHA1 223685995dc023012899793b8c29318d347d1d83 lib/HTML/FormHandler/Field/DateTime.pm
-SHA1 082d0858c1c3c9fbc6fc24fbb7b8da5cc7888ba4 lib/HTML/FormHandler/Field/Display.pm
-SHA1 a425f075439b5de6377f646ec830414c00ba5434 lib/HTML/FormHandler/Field/Duration.pm
-SHA1 1d9d58138b68e93d323a9244fd0165868e4b71af lib/HTML/FormHandler/Field/Email.pm
-SHA1 b58f697ce1b443dc7b68122d599034b2838e515c lib/HTML/FormHandler/Field/Hidden.pm
-SHA1 558bd7783b48d462fdd77998a408d9f18c036c41 lib/HTML/FormHandler/Field/Hour.pm
-SHA1 6f59180e5e8893c54e3f440c85593484cfdb2c52 lib/HTML/FormHandler/Field/HtmlArea.pm
-SHA1 c686b65d25eaece5dd300e5cec7e9df2d9bb1a10 lib/HTML/FormHandler/Field/IntRange.pm
-SHA1 9a5303d42557e1e8553cdc4d325c2a1bb15db5a6 lib/HTML/FormHandler/Field/Integer.pm
-SHA1 521021032692e1f8ddc55061096b6b3d09fb1d26 lib/HTML/FormHandler/Field/Minute.pm
-SHA1 7a8154afdadb904e0002455cdc76d3505cba8c5b lib/HTML/FormHandler/Field/Money.pm
-SHA1 6288747fa15b069fca580c876b41e0267f97db73 lib/HTML/FormHandler/Field/Month.pm
-SHA1 df591283105e059281780f051d8d8346c9ee9ed2 lib/HTML/FormHandler/Field/MonthDay.pm
-SHA1 1188c40b32d6f33a2a5c4f997961c20668c7f9b1 lib/HTML/FormHandler/Field/MonthName.pm
-SHA1 da41ca10d3efcd34a93fcffe69e6a9f5317a97ca lib/HTML/FormHandler/Field/Multiple.pm
-SHA1 2e4fcc1e7ae06468a67db88c0647c2c3ad4bc0a6 lib/HTML/FormHandler/Field/Nested.pm
-SHA1 5f4e5e13f48855bb5a442546eed630105dd639cf lib/HTML/FormHandler/Field/NoValue.pm
-SHA1 572f0f818dc087dbc8d6f348213843f1aa7e880a lib/HTML/FormHandler/Field/Password.pm
-SHA1 f706fd7187773477aa1cd929b7eb7f3857f2a106 lib/HTML/FormHandler/Field/PasswordConf.pm
-SHA1 502d61af46e6c85eb4c2a37fbc9c3c00e6568518 lib/HTML/FormHandler/Field/PosInteger.pm
-SHA1 171a36712107e1a0c037624b055c909bf128a00f lib/HTML/FormHandler/Field/PrimaryKey.pm
-SHA1 4a3273fd9299a6399d009328c822ab591778a460 lib/HTML/FormHandler/Field/Repeatable.pm
-SHA1 9dcd7940e23aae83827727129292464c03d4d6e9 lib/HTML/FormHandler/Field/Repeatable/Instance.pm
-SHA1 221b74348560daa1df8649c2646ec612e3757185 lib/HTML/FormHandler/Field/Reset.pm
-SHA1 9240d49cd600c8c462473c87c832596b561ed95e lib/HTML/FormHandler/Field/Result.pm
-SHA1 f2d5ccf0bc9d0e09f04cbd39b1af2df7338c77f8 lib/HTML/FormHandler/Field/Second.pm
-SHA1 957d52341e5a775450e0314f5842a7830e6bf8d2 lib/HTML/FormHandler/Field/Select.pm
-SHA1 e0389dc94dd60ca12db1e4f84320327434a81d65 lib/HTML/FormHandler/Field/Submit.pm
-SHA1 4c2575c80e69049394b7926609ee06b6bcb52e1f lib/HTML/FormHandler/Field/Text.pm
-SHA1 f9cb41cf9da835542ec65ae6d59d6b5e89bdcf49 lib/HTML/FormHandler/Field/TextArea.pm
-SHA1 bad1dbcbf68aedcde946dfcd84983024493fa345 lib/HTML/FormHandler/Field/Upload.pm
-SHA1 2517e54944789dc58523525d8e2d721129e0e997 lib/HTML/FormHandler/Field/Weekday.pm
-SHA1 ae1732acba7c4b10e7407fcac956ced11b289996 lib/HTML/FormHandler/Field/Year.pm
-SHA1 53cec2c6ca63d93d49a4e95a2220ef2c402716e6 lib/HTML/FormHandler/Fields.pm
-SHA1 8be7e3128f6e661347bfdae9125a25ed1ae8a9a6 lib/HTML/FormHandler/I18N.pm
-SHA1 77094944d93018b05da4067723b0c3d7f2fb2046 lib/HTML/FormHandler/I18N/de_de.pm
-SHA1 896ba86260563ca53d60b368917ba0c7bfab1b15 lib/HTML/FormHandler/I18N/en_us.pm
-SHA1 0f79dd5c903918ad581bbf7e4c3e1c21694096b4 lib/HTML/FormHandler/I18N/hu_hu.pm
-SHA1 290808fc64fcbdddc7ee7d8a111b462af59c6645 lib/HTML/FormHandler/I18N/ru_ru.pm
-SHA1 5e89c2719918a8b473082ecf683cba5776885aa0 lib/HTML/FormHandler/I18N/tr_tr.pm
-SHA1 3ba6cfda70c887a90130785a45a0c864c9a0329e lib/HTML/FormHandler/I18N/ua_ua.pm
-SHA1 185cf57fddc48db09a931e59bbd2e385eb5cd764 lib/HTML/FormHandler/InitResult.pm
-SHA1 63aca1e348928befd04b77bb2a68f687b56dbb89 lib/HTML/FormHandler/Manual.pod
-SHA1 58892dab2bd7a671ebe285f0560bd14695687554 lib/HTML/FormHandler/Manual/Catalyst.pod
-SHA1 55db97c971ca6029a0f8630279e87cdc441a39b5 lib/HTML/FormHandler/Manual/Cookbook.pod
-SHA1 f08f762c55dc47e064914f519b3907a2718a2dd1 lib/HTML/FormHandler/Manual/Intro.pod
-SHA1 c10dc12a3ffccac460801024299a028beab6cdee lib/HTML/FormHandler/Manual/Reference.pod
-SHA1 da73055a1202b1ebd910de627fa6b1af157700de lib/HTML/FormHandler/Manual/Rendering.pod
-SHA1 cb27b57ac0ebd2532e0e867ec5619571b5f30f53 lib/HTML/FormHandler/Manual/Templates.pod
-SHA1 bf9f55c9a00ebeafcc50cd44fc91dfc049ab3660 lib/HTML/FormHandler/Manual/Tutorial.pod
-SHA1 69e173befe88ac910574eeb0b3d36691fb7da8a0 lib/HTML/FormHandler/Meta/Role.pm
-SHA1 d45d9b34089f2e43c09f6fd46d74c1635403a3ae lib/HTML/FormHandler/Model.pm
-SHA1 1f5cf71d32e65aa6fe3f00ffed285d7d28e6992b lib/HTML/FormHandler/Model/CDBI.pm
-SHA1 fb36014d688a7fce9843459a8250f745faa634fa lib/HTML/FormHandler/Model/Object.pm
-SHA1 73f14e557ade9a7be49da217ea4a5ece01bdee9c lib/HTML/FormHandler/Moose.pm
-SHA1 467245f240fb5f1499c38bd61dd1678c72676b58 lib/HTML/FormHandler/Moose/Role.pm
-SHA1 3f5a395f1e7facc21945f191af5b7a27632bbba0 lib/HTML/FormHandler/Page.pm
-SHA1 1fa2e4ae99bfa85e670c4fece91d0e0bb337e6b3 lib/HTML/FormHandler/Page/Simple.pm
-SHA1 d83c1990d21c1ed190403a6f1f79ff93431aea1a lib/HTML/FormHandler/Pages.pm
-SHA1 a5528b4b5d5bf05f89478c4aaa52250b666dbe9d lib/HTML/FormHandler/Params.pm
-SHA1 6b124c5da6f1da6110703b879524900bf536f952 lib/HTML/FormHandler/Render/Simple.pm
-SHA1 e8b58475e8de222fcbb2b202cb9bb9fb24117540 lib/HTML/FormHandler/Render/Table.pm
-SHA1 1a7d832c13cbfbe59d43744786f3896a5e385072 lib/HTML/FormHandler/Render/WithTT.pm
-SHA1 fb6bc157c7965ace13a266a1e7275910085cfafe lib/HTML/FormHandler/Result.pm
-SHA1 7bb33ba2159cab4cd260c8571fde1576d731cca7 lib/HTML/FormHandler/Result/Role.pm
-SHA1 555ca0d89591991b2b954922d8c153be38975bf8 lib/HTML/FormHandler/TraitFor/Captcha.pm
-SHA1 0c9e8bec614b7da0c8ee3b10ab3440bf91543a95 lib/HTML/FormHandler/TraitFor/I18N.pm
-SHA1 5cb21c1fcc8c9693ebc52d2bd1a6a4c475cb40e1 lib/HTML/FormHandler/Traits.pm
-SHA1 09afd0e3be6c535dbd90a60698667e4e296e4371 lib/HTML/FormHandler/Types.pm
-SHA1 8cf0462536dbf08d7420e4bc2298e6fa2961bfec lib/HTML/FormHandler/Validate.pm
-SHA1 73538b7cf92921725dcb0e015737657b8462e7ba lib/HTML/FormHandler/Widget/ApplyRole.pm
-SHA1 53e9f892da92f64605453f8d63f3ef5679268de0 lib/HTML/FormHandler/Widget/Field/Button.pm
-SHA1 04e6e255656b61792fe0bf0610d90c8fb9ef404f lib/HTML/FormHandler/Widget/Field/Checkbox.pm
-SHA1 7c7c77c6cb7bcae0e00bbbaee3ee98b7115103cf lib/HTML/FormHandler/Widget/Field/CheckboxGroup.pm
-SHA1 65226b92d451d99f4ee43d40256c8b5c4d52f287 lib/HTML/FormHandler/Widget/Field/Compound.pm
-SHA1 1302519ca670c2cc988d31055d4af6690d94b45d lib/HTML/FormHandler/Widget/Field/Hidden.pm
-SHA1 8a953ea2cd8dc3838bc68cfcaf058f42b9ef80a5 lib/HTML/FormHandler/Widget/Field/NoRender.pm
-SHA1 9ddb22ee2177f111f160cf7acb068ef714379bfd lib/HTML/FormHandler/Widget/Field/Password.pm
-SHA1 c01ff5758e6cd2f60093c0d4b677a2d84aa92d1c lib/HTML/FormHandler/Widget/Field/RadioGroup.pm
-SHA1 8def9124d89bb2b34dc0909f5976cfb1f9315f84 lib/HTML/FormHandler/Widget/Field/Repeatable.pm
-SHA1 fb937822ee8c395851676cbebb4b644b4700a78e lib/HTML/FormHandler/Widget/Field/Reset.pm
-SHA1 bf5461ee158960b51649f0be80884c765ae202cd lib/HTML/FormHandler/Widget/Field/Role/HTMLAttributes.pm
-SHA1 d475662749b431ff5f7389ca8092bb72938aaf93 lib/HTML/FormHandler/Widget/Field/Role/SelectedOption.pm
-SHA1 b74c9756f45186bdc0c3dd3f97e448eef8194851 lib/HTML/FormHandler/Widget/Field/Select.pm
-SHA1 d69074280ad56b879ecebc0b55c67a339624d8a1 lib/HTML/FormHandler/Widget/Field/Submit.pm
-SHA1 acaa10d8b0b1bb5c9d13a48ac14400b07fcd7e63 lib/HTML/FormHandler/Widget/Field/Text.pm
-SHA1 31fbe4181c565e96ee2d4d7cf4d5f52d985ed30f lib/HTML/FormHandler/Widget/Field/Textarea.pm
-SHA1 1dd879a0d29176623139dedf14bb234f1772c5c9 lib/HTML/FormHandler/Widget/Field/Upload.pm
-SHA1 05dfa4d2ed83c91a19196ae4ab6507a1f4cbb865 lib/HTML/FormHandler/Widget/Form/Role/HTMLAttributes.pm
-SHA1 0bb184413b46c1daa3604bd867b435956ba4f74f lib/HTML/FormHandler/Widget/Form/Simple.pm
-SHA1 382ce42e2180ec41a29bf6427b05fe1e6c5ed94e lib/HTML/FormHandler/Widget/Form/Table.pm
-SHA1 ed4cef98da6ac7000fda756a7809090d8b51ad34 lib/HTML/FormHandler/Widget/Wrapper/Base.pm
-SHA1 77f1de33691a6540d0f08699b177161fc022156f lib/HTML/FormHandler/Widget/Wrapper/Fieldset.pm
-SHA1 1ba2c34f445b2772021718cefdfc0aa2a9c1006d lib/HTML/FormHandler/Widget/Wrapper/None.pm
-SHA1 a7d4461cbb72d1a27c8fd125741c51d660029b9c lib/HTML/FormHandler/Widget/Wrapper/Simple.pm
-SHA1 69bc715ad29361e75792587d4d101f3aa8f4d239 lib/HTML/FormHandler/Widget/Wrapper/Table.pm
-SHA1 f97d466ce5e0747d2b61122faa7f9abf610942ba lib/HTML/FormHandler/Wizard.pm
+SHA1 b62ee117cdf78b14ae7641b9cf178a1af74dc586 MANIFEST
+SHA1 8e8d2227b2bcc4d3eedd73160a24d807d9f31e07 META.json
+SHA1 5f1309bfd1e1568b4a18ea3de76ea56dbc05d52d META.yml
+SHA1 59c5ca19e6ee2043aa7bb20975c836a3718b54ee Makefile.PL
+SHA1 a33e24d39750650a30b15f782cd7f18bcf09b010 README
+SHA1 62a27d3618068dd20f965d6fcacf1208450bf4df TODO
+SHA1 fb6f20616fba1429f6db808967d5a9081637e80d dist.ini
+SHA1 aedc3333bfef7c628e16dc837adda0e9a31b76d1 lib/HTML/FormHandler.pm
+SHA1 00ae1450a85066c7c5222e20815fe7c89d888816 lib/HTML/FormHandler/Base.pm
+SHA1 4a5a432af643da9a829fab0b028b654590f16343 lib/HTML/FormHandler/BuildFields.pm
+SHA1 7cefad5e56495649d9329b4e80fbb574f2c64dbe lib/HTML/FormHandler/BuildPages.pm
+SHA1 8a83b45a01fe5241b2a3ea9067b838f5b34c2987 lib/HTML/FormHandler/Field.pm
+SHA1 8c835713345818a64f5643307e30bec944a5a100 lib/HTML/FormHandler/Field/Boolean.pm
+SHA1 72b23e02219f9bc6d493ab81734835e36d821932 lib/HTML/FormHandler/Field/Button.pm
+SHA1 65713926510dcb19987285cef8a0af553acdebbe lib/HTML/FormHandler/Field/Captcha.pm
+SHA1 62bcba46605981bc66c83d501c6274e4e59f3e4e lib/HTML/FormHandler/Field/Checkbox.pm
+SHA1 23ab6d5ba2c575fba8be9a03fee28e90bb9ec239 lib/HTML/FormHandler/Field/Compound.pm
+SHA1 a42da7b49c37658890c1af3547ac26fe16517d42 lib/HTML/FormHandler/Field/Date.pm
+SHA1 65e25446083852aec5c49d2ab5b047f31f2e3fdd lib/HTML/FormHandler/Field/DateMDY.pm
+SHA1 c38658a8b08d15e521a90f5dbc15960f4c670702 lib/HTML/FormHandler/Field/DateTime.pm
+SHA1 cefe5e43c3fb78f42282227cd1d139837aa42a6c lib/HTML/FormHandler/Field/Display.pm
+SHA1 b76ea502b441903f76c88a20d6a18a3efd82b623 lib/HTML/FormHandler/Field/Duration.pm
+SHA1 6324bf746f85e5d73fab43605e96e26fc955a04c lib/HTML/FormHandler/Field/Email.pm
+SHA1 783f5d390c48b57cfabce2232fead9316f09638a lib/HTML/FormHandler/Field/Hidden.pm
+SHA1 842d2715c800b44a241ba1f5a1fd6d08818c570c lib/HTML/FormHandler/Field/Hour.pm
+SHA1 c5c60a044e5d9d70fbd0b084f303014c8a8194b9 lib/HTML/FormHandler/Field/HtmlArea.pm
+SHA1 10a462148d55a6b0602174cac753649aa621a814 lib/HTML/FormHandler/Field/IntRange.pm
+SHA1 99fa19eeacc2d32df99cbee749bfd48e8cfe9b4f lib/HTML/FormHandler/Field/Integer.pm
+SHA1 e9bbddd5553154e94a0fdca747e1e98e0ba17475 lib/HTML/FormHandler/Field/Minute.pm
+SHA1 76dd471fa64c85d55210d5b7b08e646f0eca708a lib/HTML/FormHandler/Field/Money.pm
+SHA1 efdbd7246419d73e538eb7f7e5c5b08a858b3cf1 lib/HTML/FormHandler/Field/Month.pm
+SHA1 8c03d055debd0940a7ac58e46cf9d2ee79a37246 lib/HTML/FormHandler/Field/MonthDay.pm
+SHA1 6f2ec3241763156eb757302cfd255593fd4a8f7d lib/HTML/FormHandler/Field/MonthName.pm
+SHA1 99348640b0f8201b9cf4307f240b705f8aa13527 lib/HTML/FormHandler/Field/Multiple.pm
+SHA1 bccc279f227a799cebe6c39d3ab81a6014ad96d7 lib/HTML/FormHandler/Field/Nested.pm
+SHA1 ba76ac84f56a743bacd96051bac97ab90b0e28df lib/HTML/FormHandler/Field/NoValue.pm
+SHA1 2a0274ba40124ea913ad6404b2d9cc9ec85a43da lib/HTML/FormHandler/Field/Password.pm
+SHA1 92ced9712c0ae058e9d091f6070adb5ce98263c3 lib/HTML/FormHandler/Field/PasswordConf.pm
+SHA1 03d405be19d4c5638816c1c9e640330a1a65bcfc lib/HTML/FormHandler/Field/PosInteger.pm
+SHA1 88f779565617a14dcf744c5e03f1ecc5d5a50687 lib/HTML/FormHandler/Field/PrimaryKey.pm
+SHA1 d4e387d9b2adcc16162f718d6241386820b9a1df lib/HTML/FormHandler/Field/Repeatable.pm
+SHA1 d0ca3e346b7a865e85574ff51d0e68e7608004e9 lib/HTML/FormHandler/Field/Repeatable/Instance.pm
+SHA1 08c4fa6ac8a9d2c3ab32b558ea18e2fa5ae13d12 lib/HTML/FormHandler/Field/Reset.pm
+SHA1 cbe5cc8c42a12cc23f6e1afc42f6d2d2c83fba84 lib/HTML/FormHandler/Field/Result.pm
+SHA1 2e27424184b43db89f014cf078ecfe5c48abd2d1 lib/HTML/FormHandler/Field/Second.pm
+SHA1 3bcb5caad2343218f0aca303afb3bbb8f4091b21 lib/HTML/FormHandler/Field/Select.pm
+SHA1 ef59a176b136782c5882c804f8dfa69356dd0eac lib/HTML/FormHandler/Field/Submit.pm
+SHA1 eeeb89b7cd496035be8f645a64f6a564ef126a6c lib/HTML/FormHandler/Field/Text.pm
+SHA1 0bb33a3f49598e90de30dc95c704868760f98f7a lib/HTML/FormHandler/Field/TextArea.pm
+SHA1 d2f80778ce58f3b79f15e2331edb90ea9eade127 lib/HTML/FormHandler/Field/Upload.pm
+SHA1 4f407dc41c867568709bb0e9c58937d33192420f lib/HTML/FormHandler/Field/Weekday.pm
+SHA1 5c115d5caab6859f57461d300ca42c9922b74759 lib/HTML/FormHandler/Field/Year.pm
+SHA1 727f4264fb28e7b736c7f019c8e7e342ef1105a1 lib/HTML/FormHandler/Fields.pm
+SHA1 5ae3405996ca1d7100985584bbf8d9ea871440ef lib/HTML/FormHandler/I18N.pm
+SHA1 bd862cdb259ea889994669b336674e61d167c00b lib/HTML/FormHandler/I18N/de_de.pm
+SHA1 ce937e3191a2f2edbfea5b8f5a897ad275b46953 lib/HTML/FormHandler/I18N/en_us.pm
+SHA1 68401849b468a0caac427b2b17647493f48a4c07 lib/HTML/FormHandler/I18N/hu_hu.pm
+SHA1 806e36d1db030efc81fc9ce3a940c7c21666f257 lib/HTML/FormHandler/I18N/ru_ru.pm
+SHA1 7e772d5b65d5b2d5b62d60a2c1f7ebbd6e1904ba lib/HTML/FormHandler/I18N/tr_tr.pm
+SHA1 cabde664ff88c444f917d6dc47cc75a69f35f78c lib/HTML/FormHandler/I18N/ua_ua.pm
+SHA1 53dda366d12ce1ae12183177c9c91baa65fcdd70 lib/HTML/FormHandler/InitResult.pm
+SHA1 ee75da28cc27e55cd69b9f742e46df9a9766a1af lib/HTML/FormHandler/Manual.pod
+SHA1 3b446a75a99306fae455a3f59b2de4d761f853b9 lib/HTML/FormHandler/Manual/Catalyst.pod
+SHA1 3d0d3a3de59f5915fbe0106cbe34c7f89e1fe595 lib/HTML/FormHandler/Manual/Cookbook.pod
+SHA1 359023c4eb7d223da63c65cf7c692d3a3bb3a6c1 lib/HTML/FormHandler/Manual/Intro.pod
+SHA1 5933ec9372fe38a3bd6cf2009c41de6fd6fc2629 lib/HTML/FormHandler/Manual/Reference.pod
+SHA1 18067d00861e4755aa077d7729784225b70dce62 lib/HTML/FormHandler/Manual/Rendering.pod
+SHA1 ee0376cceab360ffb22fa9f769b1dea4f5a97559 lib/HTML/FormHandler/Manual/Templates.pod
+SHA1 02bb29fe5221366fffde84c3b3d4c4f5e4883b1f lib/HTML/FormHandler/Manual/Tutorial.pod
+SHA1 6f64dd17f963993a550a7e9056a8a4198d0f9c9f lib/HTML/FormHandler/Meta/Role.pm
+SHA1 8cafdeb722f63c188ef4616f2ecc6d34a2803d9b lib/HTML/FormHandler/Model.pm
+SHA1 66ba233ecb4de02ac88243dc5e4f547c49304fc5 lib/HTML/FormHandler/Model/CDBI.pm
+SHA1 fe6fc07e5d9c980343dcfd4482ef0d277583cf88 lib/HTML/FormHandler/Model/Object.pm
+SHA1 1c2900b22cd5c76dfeb75a8ab83d3c1e371adddb lib/HTML/FormHandler/Moose.pm
+SHA1 48de719c0124d4c04b0dc0853d1f8cf12c56f33a lib/HTML/FormHandler/Moose/Role.pm
+SHA1 bdff28f78bae404eeed2d93946af8f46b9d1518e lib/HTML/FormHandler/Page.pm
+SHA1 3a09f6a9fe2fb54ffdf77c1c18545bd4f0882745 lib/HTML/FormHandler/Page/Simple.pm
+SHA1 aa1b9169b50a348158378d04fb39fab0aea669c9 lib/HTML/FormHandler/Pages.pm
+SHA1 07ea579abdea417a35420d53a9bf71256fe84904 lib/HTML/FormHandler/Params.pm
+SHA1 be2f09fa981debe3d75511c13ca3a2bc1ef59832 lib/HTML/FormHandler/Render/Simple.pm
+SHA1 be4a641158dab2668a21f7e1b0e0eaa3e6878322 lib/HTML/FormHandler/Render/Table.pm
+SHA1 a7a958e6baa54614c0da823ed223d0f2ec665016 lib/HTML/FormHandler/Render/WithTT.pm
+SHA1 7cdb42bfea8a6ebb441e0da9c119d0e151f88649 lib/HTML/FormHandler/Result.pm
+SHA1 e2de28325e05efb903cfd7fa7bc8b7ecde886fa3 lib/HTML/FormHandler/Result/Role.pm
+SHA1 0a5ac0d71f9f9d7b0f9c3a7b255ebbc1d6fbd3f7 lib/HTML/FormHandler/TraitFor/Captcha.pm
+SHA1 d8469c8dda1769400b1cd4c1d82a60ed1109b42b lib/HTML/FormHandler/TraitFor/I18N.pm
+SHA1 e2c5f0166107d295c892653e10d16d6f19d6033a lib/HTML/FormHandler/Traits.pm
+SHA1 f6647c19877e269d8a3e5fddec4480b884eb48a1 lib/HTML/FormHandler/Types.pm
+SHA1 80a96d5f3eee8fd555e80dc8fb989f3e5e3f34cc lib/HTML/FormHandler/Validate.pm
+SHA1 22fe304ed72ac9dc61df52b3c2fd7452f0878583 lib/HTML/FormHandler/Widget/ApplyRole.pm
+SHA1 27d246f55c882d557842d8b9997c4ee65d46d072 lib/HTML/FormHandler/Widget/Field/Button.pm
+SHA1 6211a08c879d8b99df65205ad5df0912a730bcbe lib/HTML/FormHandler/Widget/Field/Checkbox.pm
+SHA1 00ebf5455e0bc4c834b497f8fac73fc177bda228 lib/HTML/FormHandler/Widget/Field/CheckboxGroup.pm
+SHA1 ba604c3f603a51ed31ce4bfe31b023dcfea3cc4d lib/HTML/FormHandler/Widget/Field/Compound.pm
+SHA1 6ba3ae0972f99c25b22438eab962dc38ad89caec lib/HTML/FormHandler/Widget/Field/Hidden.pm
+SHA1 ea641d348079ee4beed937ecf28678162227967a lib/HTML/FormHandler/Widget/Field/NoRender.pm
+SHA1 1703b1195e8cf3c56d0a5f9c76e52c3f03cbc52a lib/HTML/FormHandler/Widget/Field/Password.pm
+SHA1 cdd81f0eb24f321807da184dc0e5ad69283be06a lib/HTML/FormHandler/Widget/Field/RadioGroup.pm
+SHA1 8bfdbe8b0ac418f303de8157501ea11679fd39cf lib/HTML/FormHandler/Widget/Field/Repeatable.pm
+SHA1 60e4aafc8431e4677912bcc9bb281ef8bd1b7917 lib/HTML/FormHandler/Widget/Field/Reset.pm
+SHA1 ab357fa2635adbbfe987f3e1f2c9c1b1b38d484e lib/HTML/FormHandler/Widget/Field/Role/HTMLAttributes.pm
+SHA1 fa852f70d48013d6886204b699b6ee41433f82c2 lib/HTML/FormHandler/Widget/Field/Role/SelectedOption.pm
+SHA1 b19b6dbd38c3865794b3a23863087d88458dcc7a lib/HTML/FormHandler/Widget/Field/Select.pm
+SHA1 0366a5d4b6bf854bb0511eb22242268eb35a002b lib/HTML/FormHandler/Widget/Field/Submit.pm
+SHA1 14b8193ffcf7f60e043b4b0f6d5cb9eff67e11cd lib/HTML/FormHandler/Widget/Field/Text.pm
+SHA1 ed1cbd62b1092e52d1619343a699cea7c6bf7eb9 lib/HTML/FormHandler/Widget/Field/Textarea.pm
+SHA1 48e2cf98eb4aeb3eb04182a05af99287988d6093 lib/HTML/FormHandler/Widget/Field/Upload.pm
+SHA1 00f895e4a133778e7c6f29804ecc19fe4eb077d3 lib/HTML/FormHandler/Widget/Form/Role/HTMLAttributes.pm
+SHA1 b09b71d1619f62d3de154f8bd25f20e9b4cd4eb1 lib/HTML/FormHandler/Widget/Form/Simple.pm
+SHA1 dada13ac39870a11ed8878b0553c8e1f6d77ca76 lib/HTML/FormHandler/Widget/Form/Table.pm
+SHA1 7e79bae2ea42ebab8f75a3ef15c7c3e3cdcba58a lib/HTML/FormHandler/Widget/Wrapper/Base.pm
+SHA1 f1f9662dcec321c4423ec2421c2e14e8bb1145b4 lib/HTML/FormHandler/Widget/Wrapper/Fieldset.pm
+SHA1 99a0af18298478491366d8000a5ff043566545ac lib/HTML/FormHandler/Widget/Wrapper/None.pm
+SHA1 de08fc46bba202f97d1ab8cb66b93bc80e07caad lib/HTML/FormHandler/Widget/Wrapper/Simple.pm
+SHA1 db6e830a6fc53061cb5f6b673d223ed14170bf33 lib/HTML/FormHandler/Widget/Wrapper/SimpleInline.pm
+SHA1 fdcd8f9d693f7c1479a088498292ecf589038357 lib/HTML/FormHandler/Widget/Wrapper/Table.pm
+SHA1 0b99e5bad222a87430b83ac87dc3250f6a3bb6d8 lib/HTML/FormHandler/Widget/Wrapper/TableInline.pm
+SHA1 76a32c4d47a182f8314a9cad8d42af0b5ef59e8a lib/HTML/FormHandler/Wizard.pm
SHA1 2feb6b79d4067908ddbd31bcc3b16b5c985c7317 share/templates/form.tt
SHA1 76f3e3ab9d9eee7a6905de342f389e09c3ba4db7 share/templates/widget/button.tt
SHA1 23b56c71b85d991822f9aee41b212ff5a771711d share/templates/widget/checkbox.tt
@@ -151,6 +153,7 @@ SHA1 b5caf79791036188da09eb6f687fda432f908657 share/templates/widget/textarea.tt
SHA1 95a5a44cf72244e6abebd50fa7dc666440c625e7 share/templates/widget/upload.tt
SHA1 d55b2da9ebb18c4da78ae398a555d19728397acd t/01app.t
SHA1 35d1f710ceefee28f2f2a7c2607fe6d8817feadf t/build_id.t
+SHA1 f79bd28f8c46f9ed5377912104bb2f39be9afbe2 t/circular_refs.t
SHA1 9489e970b3d3f5bd0ca82ba7704a0589546d278c t/composed.t
SHA1 55d1bdda5802314b2776313c5596457765760a4c t/compound_field.t
SHA1 4cb483d5b32088354959504d5a905150bd35e5e8 t/constraints.t
@@ -159,14 +162,14 @@ SHA1 db981319c81a63199378d74bafaa042b4e4c5f16 t/defaults.t
SHA1 f0c7b7e1de8669c7dda7fcbfc88c88ee83e558f9 t/deflate.t
SHA1 67c6959a7f2136798c11e7b7c13a2dd339108f86 t/dependency.t
SHA1 f6d1ddf31d2715bc0e0fae057905658bd9234cb1 t/dynamic.t
-SHA1 2be975e74844f677884b63053fc2dc4826777fb6 t/errors.t
+SHA1 c98c4d8227dfaf77817afd6b5ab7f29248312bfc t/errors.t
SHA1 84cbaf51c785a855f86e09a75810826b013b74ff t/field_item.t
-SHA1 73a9fe74f86d851787f7a6ce2e860b4a17650581 t/field_traits.t
+SHA1 d92637d1b3778d0a4237eadc585ed93313669dba t/field_traits.t
SHA1 9df70077085901fa5697d58e3929c17c16f367ac t/field_types.t
SHA1 f0d498d0ec8276a4bf6c3df3172584a5dd876e73 t/fields.t
SHA1 e77fc6b8b02f7517e07abbaa963390d58b0d2029 t/filters.t
SHA1 5ab405305432299244ed7a2cac374e52852b65e2 t/form_handler.t
-SHA1 f99e13a0fb4d8ba5ff51f84b2491278218779754 t/form_options.t
+SHA1 bdb12d93e67c84fad3e642ac86124c900568742f t/form_options.t
SHA1 1c7e3714c63b6ca0f42bad837b9fde746bcfac2c t/formhandlerx.t
SHA1 7ff46198ffd967b30d0999b10ff80fc08bef0770 t/has_field.t
SHA1 8b58baf90cdbb31f699df1b01343bb008e046f82 t/has_field_arrayref.t
@@ -201,8 +204,9 @@ SHA1 5390fbb14f7e14a1196e962e388d18cc4cafba61 t/render_form_errors.t
SHA1 bef13448710957b177666eff70a58673a1b38b7d t/render_html_attributes.t
SHA1 d982d9e380c9d73992708f2ed7da728dcbf0812e t/render_result.t
SHA1 8b405631abeae7f814d923852ff6821eeea6b33f t/render_table.t
-SHA1 c8fe20c36577949e3fe3fccbe51de8998c00126c t/render_widgets.t
+SHA1 334ad8cb279d0d73c35576ba0ab27676ab8fd7fe t/render_widgets.t
SHA1 66fc1b48eb105777b4ebf11189f7b35533f29d47 t/render_withtt.t
+SHA1 ac6e1d96589f66cf2f13f4b7c883b7b6a46b7b73 t/rep_nest.t
SHA1 27bb7901f2f5b8612e014c8013ef28cf8924ff2d t/reprender.t
SHA1 a98bd1e8013013d26ca7ecd2bdcac079969a255a t/req_message.t
SHA1 3422cd5aac318955cd48a51439875bcf859e9043 t/result.t
@@ -242,7 +246,7 @@ SHA1 adab33636d288b5fea945c325dc964c5937cb7f5 xt/upload.t
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (Darwin)
-iF4EAREIAAYFAk1kH7IACgkQlX0ZOkgCucgkiAD+JEu6MFkJCjhN6dnON7dRrRaN
-YriIuu53by5XRulsfXoA/0/GmNlpVfT9bDH+0duXW4gJp1PhLMj3/p/rCCbgrKgm
-=/Pwl
+iF4EAREIAAYFAk3RaH8ACgkQlX0ZOkgCucgI9AD/bRUkW6smMfO+bDTmXNPxMqXX
+3xrXJngQcX5zZVaGFjMA/32KNu7K4lAuwnKqC0TTQsDDt+8mmXgMURH8ES8sP3YZ
+=MBL3
-----END PGP SIGNATURE-----
@@ -1,5 +1,4 @@
Improve TT rendering
- Refactor messages to set in one place and make translations easier
Unique support for non-top-level fields?
Improve example of Repeatable form (BookDB, User) to do adds & deletes with js
Create more usable 'add_field' routine that will handle ordering, parent,
@@ -7,7 +7,7 @@ license = Perl_5
copyright_holder = Gerda Shank
copyright_year = 2010
-version = 0.33002
+version = 0.34001
[@Basic]
[InstallGuide]
@@ -31,7 +31,7 @@ repository.type = git
[Prereqs]
Carp = 0
-Moose = 0.90
+Moose = 2.0007
Locale::Maketext = 1.09
DateTime = 0
DateTime::Format::Strptime = 0
@@ -49,6 +49,7 @@ Email::Valid = 0
Test::More = 0.94
Test::Differences = 0
Test::Exception = 0
+Test::Memory::Cycle = 1.04
; If you're using git, this is interesting
; You need to install Dist::Zilla::PluginBundle::Git
@@ -15,7 +15,7 @@ HTML::FormHandler::Base - stub
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -245,7 +245,6 @@ sub new_field_with_traits {
my ( $self, $class, $field_attr ) = @_;
my $widget = $field_attr->{widget};
- my $field;
unless( $widget ) {
my $attr = $class->meta->find_attribute_by_name( 'widget' );
if ( $attr ) {
@@ -270,12 +269,9 @@ sub new_field_with_traits {
push @traits, $widget_role, $wrapper_role;
}
if( @traits ) {
- my $new_class = $class->with_traits( @traits );
- $field = $new_class->new( %{$field_attr} );
- }
- else {
- $field = $class->new( %{$field_attr} );
+ $class = $class->with_traits( @traits );
}
+ my $field = $class->new( %{$field_attr} );
if( $field->form ) {
foreach my $key ( keys %{$field->form->widget_tags} ) {
$field->set_tag( $key, $field->form->widget_tags->{$key} )
@@ -297,7 +293,7 @@ HTML::FormHandler::BuildFields - role to build field array
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -235,7 +235,7 @@ HTML::FormHandler::BuildPages - used in Wizard
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -27,7 +27,7 @@ HTML::FormHandler::Field::Boolean - a true or false field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::Button - button field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -101,7 +101,7 @@ HTML::FormHandler::Field::Captcha - captcha field with GD::SecurityImage
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -36,7 +36,7 @@ HTML::FormHandler::Field::Checkbox - a checkbox field type
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -85,7 +85,7 @@ HTML::FormHandler::Field::Compound - field consisting of subfields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -113,7 +113,7 @@ HTML::FormHandler::Field::Date - a date field with formats
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SUMMARY
@@ -20,7 +20,7 @@ HTML::FormHandler::Field::DateMDY - m/d/y date field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -71,7 +71,7 @@ HTML::FormHandler::Field::DateTime - compound DateTime field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -73,7 +73,7 @@ HTML::FormHandler::Field::Display - display only field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -52,7 +52,7 @@ HTML::FormHandler::Field::Duration - DateTime::Duration from HTML form values
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SubFields
@@ -47,7 +47,7 @@ HTML::FormHandler::Field::Email - validates email using Email::Valid
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -21,7 +21,7 @@ HTML::FormHandler::Field::Hidden - hidden field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::Hour - accept integer from 0 to 23
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -82,7 +82,7 @@ HTML::FormHandler::Field::HtmlArea - input HTML in a textarea
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -42,7 +42,7 @@ HTML::FormHandler::Field::IntRange - integer range in select list
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -53,7 +53,7 @@ HTML::FormHandler::Field::Integer - validate an integer value
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -23,7 +23,7 @@ HTML::FormHandler::Field::Minute - input range from 0 to 59
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -58,7 +58,7 @@ HTML::FormHandler::Field::Money - US currency-like values
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::Month - select list 1 to 12
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::MonthDay - select list 1 to 31
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -38,7 +38,7 @@ HTML::FormHandler::Field::MonthName - select list with month names
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -11,18 +11,15 @@ has '+size' => ( default => 5 );
sub sort_options {
my ( $self, $options ) = @_;
- my $value = $self->value;
+ return $options unless scalar @$options && defined $self->value;
+ my $value = $self->deflate($self->value);
+ return $options unless scalar @$value;
# This places the currently selected options at the top of the list
# Makes the drop down lists a bit nicer
- if ( @$options && defined $value ) {
- my %selected = map { $_ => 1 } ref($value) eq 'ARRAY' ? @$value : ($value);
-
- my @out = grep { $selected{ $_->{value} } } @$options;
- push @out, grep { !$selected{ $_->{value} } } @$options;
-
- return \@out;
- }
- return $options;
+ my %selected = map { $_ => 1 } @$value;
+ my @out = grep { $selected{ $_->{value} } } @$options;
+ push @out, grep { !$selected{ $_->{value} } } @$options;
+ return \@out;
}
@@ -39,7 +36,7 @@ HTML::FormHandler::Field::Multiple - multiple select list
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -20,7 +20,7 @@ HTML::FormHandler::Field::Nested - for nested elements of compound fields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -61,7 +61,7 @@ HTML::FormHandler::Field::NoValue - base class for submit field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -64,7 +64,7 @@ HTML::FormHandler::Field::Password - password field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -54,7 +54,7 @@ HTML::FormHandler::Field::PasswordConf - password confirmation
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -43,7 +43,7 @@ HTML::FormHandler::Field::PosInteger - positive integer field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -21,7 +21,7 @@ HTML::FormHandler::Field::PrimaryKey - primary key field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -27,7 +27,7 @@ HTML::FormHandler::Field::Repeatable::Instance - used internally by repeatable f
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -208,6 +208,8 @@ before 'value' => sub {
my @pk_elems =
map { $_->accessor } grep { $_->has_flag('is_primary_key') } $self->contains->all_fields
if $self->contains->has_flag('is_compound');
+
+ return [] unless $self->has_value;
my $value = $self->result->value;
my @new_value;
foreach my $element ( @{$value} ) {
@@ -239,7 +241,7 @@ HTML::FormHandler::Field::Repeatable - repeatable (array) field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::Reset - reset field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -62,7 +62,7 @@ HTML::FormHandler::Field::Result - result class for fields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -22,7 +22,7 @@ HTML::FormHandler::Field::Second - select list 0 to 59
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -68,6 +68,9 @@ sub _form_options {
}
has 'multiple' => ( isa => 'Bool', is => 'rw', default => '0' );
+# following is for unusual case where a multiple select is a has_many type relation
+has 'has_many' => ( isa => 'Str', is => 'rw' );
+has '+deflate_to' => ( default => 'fif' );
has 'size' => ( isa => 'Int|Undef', is => 'rw' );
has 'label_column' => ( isa => 'Str', is => 'rw', default => 'name' );
has 'localize_labels' => ( isa => 'Bool', is => 'rw' );
@@ -142,6 +145,9 @@ sub _inner_validate_field {
# create a lookup hash
my %options = map { $_->{value} => 1 } @{ $self->options };
+ if( $self->has_many ) {
+ $value = [map { $_->{$self->has_many} } @$value];
+ }
for my $value ( ref $value eq 'ARRAY' ? @$value : ($value) ) {
unless ( $options{$value} ) {
$self->add_error($self->get_message('select_invalid_value'), $value);
@@ -221,13 +227,35 @@ sub _load_options {
sub sort_options { shift; return shift; }
before 'value' => sub {
- my $self = shift;
+ my $self = shift;
+
+ return undef unless $self->has_result;
my $value = $self->result->value;
- if( $self->multiple && (!defined $value || $value eq '') ) {
- $self->_set_value([]);
+
+ if( $self->multiple ) {
+ if ( !defined $value || $value eq '' ) {
+ $self->_set_value( [] );
+ }
+ elsif ( $self->has_many && scalar @$value && ref($value->[0]) ne 'HASH' ) {
+ my @new_values;
+ foreach my $ele (@$value) {
+ push @new_values, { $self->has_many => $ele };
+ }
+ $self->_set_value( \@new_values );
+ }
}
};
+sub deflate {
+ my ( $self, $value ) = @_;
+
+ return $value unless ( $self->has_many && $self->multiple );
+
+ # the following is for the edge case of a has_many select
+ return $value unless ref($value) eq 'ARRAY' && scalar @$value && ref($value->[0]) eq 'HASH';
+ return [map { $_->{$self->has_many} } @$value];
+}
+
__PACKAGE__->meta->make_immutable;
use namespace::autoclean;
1;
@@ -241,7 +269,7 @@ HTML::FormHandler::Field::Select - select fields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -459,6 +487,21 @@ This does a string compare.
Customize 'select_invalid_value' and 'select_not_multiple'. Though neither of these
messages should really be seen by users in a properly constructed select.
+=head1 Database relations
+
+Also see L<HTML::FormHandler::TraitFor::Model::DBIC>.
+
+The single select is for a DBIC 'belongs_to' relation. The multiple select is for
+a 'many_to_many' relation.
+
+There is very limited ability to do multiple select with 'has_many' relations.
+It will only work in very specific circumstances, and requires setting
+the 'has_many' attribute to the name of the primary key of the related table.
+This is a somewhat peculiar data structure for a relational database, and may
+not be what you really want. A 'has_many' is usually represented with a Repeatable
+field, and may require custom code if the form structure doesn't match the database
+structure. See L<HTML::FormHandler::Manual::Cookbook>.
+
=head1 AUTHOR
FormHandler Contributors - see HTML::FormHandler
@@ -29,7 +29,7 @@ HTML::FormHandler::Field::Submit - submit field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -71,7 +71,7 @@ HTML::FormHandler::Field::Text - text field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -23,7 +23,7 @@ HTML::FormHandler::Field::TextArea - textarea input
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 Summary
@@ -87,7 +87,7 @@ HTML::FormHandler::Field::Upload - file upload field
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -33,7 +33,7 @@ HTML::FormHandler::Field::Weekday - select list day of week strings
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -33,7 +33,7 @@ HTML::FormHandler::Field::Year - year selection list
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -15,7 +15,7 @@ our $VERSION = '0.02';
has 'name' => ( isa => 'Str', is => 'rw', required => 1 );
has 'type' => ( isa => 'Str', is => 'rw', default => sub { ref shift } );
-has 'parent' => ( is => 'rw', predicate => 'has_parent' );
+has 'parent' => ( is => 'rw', predicate => 'has_parent', weak_ref => 1 );
sub has_fields { }
has 'input_without_param' => (
is => 'rw',
@@ -71,26 +71,20 @@ sub build_result {
sub input {
my $self = shift;
+
+ # allow testing fields individually by creating result if no form
+ return undef unless $self->has_result || !$self->form;
my $result = $self->result;
- # garbage collection should not happen
- # but just in case resetting for safety
- unless ( $result ) {
- $self->clear_result;
- $result = $self->result;
- }
return $result->_set_input(@_) if @_;
return $result->input;
}
sub value {
my $self = shift;
+
+ # allow testing fields individually by creating result if no form
+ return undef unless $self->has_result || !$self->form;
my $result = $self->result;
- # garbage collection should not happen
- # but just in case resetting for safety
- unless ( $result ) {
- $self->clear_result;
- $result = $self->result;
- }
return $result->_set_value(@_) if @_;
return $result->value;
}
@@ -711,7 +705,7 @@ HTML::FormHandler::Field - base class for fields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -13,6 +13,7 @@ has 'fields' => (
handles => {
all_fields => 'elements',
clear_fields => 'clear',
+ add_field => 'push',
push_field => 'push',
num_fields => 'count',
has_fields => 'count',
@@ -33,10 +34,6 @@ sub add_error_field {
}
sub num_error_fields { shift->result->num_error_results }
-sub add_field {
- shift->push_field(@_);
-}
-
has 'field_name_space' => (
isa => 'Str|ArrayRef[Str]|Undef',
is => 'rw',
@@ -201,7 +198,7 @@ HTML::FormHandler::Fields - internal role for form and compound fields
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -109,7 +109,7 @@ HTML::FormHandler::I18N::de_de - German message translations
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -25,7 +25,7 @@ HTML::FormHandler::I18N::en_us - base message file
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -110,7 +110,7 @@ HTML::FormHandler::I18N::hu_hu - Hungarian message file
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -109,7 +109,7 @@ HTML::FormHandler::I18N::ru_ru - Russian message file
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -109,7 +109,7 @@ HTML::FormHandler::I18N::tr_tr - Turkish message file
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -109,7 +109,7 @@ HTML::FormHandler::I18N::ua_ua - Ukrainian message file
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -31,7 +31,7 @@ HTML::FormHandler::I18N - internationalization
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -111,7 +111,13 @@ sub _get_value {
if( $field->_can_deflate && $field->deflate_to eq 'value' ) {
@values = $field->_apply_deflation(@values);
}
- my $value = @values > 1 ? \@values : shift @values;
+ my $value;
+ if( $field->has_flag('multiple')) {
+ $value = scalar @values == 1 && ! defined $values[0] ? [] : \@values;
+ }
+ else {
+ $value = @values > 1 ? \@values : shift @values;
+ }
return $value;
}
@@ -127,7 +133,7 @@ HTML::FormHandler::InitResult - internal code
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -11,7 +11,7 @@ HTML::FormHandler::Manual::Catalyst - using HFH forms in Catalyst
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -11,7 +11,7 @@ HTML::FormHandler::Manual::Cookbook - FormHandler use recipes
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -721,6 +721,41 @@ method:
$self->field('foo')->default('my_form');
}
+=head2 Static form, dynamic field IDs
+
+The problem: you have a form that will be used in multiple places on a page, but you don't
+want to use a static form instead of doing 'new' for each. You can pass a form name in
+on the process call and use 'html_prefix' in the form:
+
+ $form->process( name => '...', params => {} );
+
+But the field 'id' attribute has already been constructed and doesn't change.
+
+Solution: apply a role to the base field class to replace the 'id' getter for the 'id'
+attribute with a method which constructs the 'id' dynamically. Since the role is
+being applied to the base field class, you can't just use 'sub id', because the
+'id' method defined by the 'id' attribute has precedence. So create an 'around'
+method modifier that replaces it in the role.
+
+ package My::DynamicFieldId;
+ use Moose::Role;
+ around 'id' => sub {
+ my $orig = shift;
+ my $self = shift;
+ my $form_name = $self->form->name;
+ return $form_name . "." . $self->full_name;
+ };
+
+ package My::CustomIdForm;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has '+html_prefix' => ( default => 1 );
+ has '+field_traits' => ( default => sub { ['My::DynamicFieldId'] } );
+
+ has_field 'foo';
+ has_field 'bar';
+
=head1 AUTHOR
FormHandler Contributors - see HTML::FormHandler
@@ -11,7 +11,7 @@ HTML::FormHandler::Manual::Intro - introduction to using FormHandler
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SUMMARY
@@ -12,7 +12,7 @@ HTML::FormHandler::Manual::Reference - concise reference
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -11,7 +11,7 @@ HTML::FormHandler::Manual::Rendering - how to render with FormHandler
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -11,7 +11,7 @@ HTML::FormHandler::Manual::Templates - using templates
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -12,7 +12,7 @@ HTML::FormHandler::Manual::Tutorial - how to use FormHandler with Catalyst
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -13,7 +13,7 @@ HTML::FormHandler::Manual - index of the manual
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 DESCRIPTION
@@ -53,7 +53,7 @@ HTML::FormHandler::Meta::Role - field_list and apply_list
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -293,7 +293,7 @@ HTML::FormHandler::Model::CDBI - Class::DBI model class (non-functioning)
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -27,7 +27,7 @@ HTML::FormHandler::Model::Object - stub for Object model
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -63,7 +63,7 @@ HTML::FormHandler::Model - default model base class
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -57,7 +57,7 @@ HTML::FormHandler::Moose::Role - to add sugar to roles
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -67,7 +67,7 @@ HTML::FormHandler::Moose - to add FormHandler sugar
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -15,7 +15,7 @@ HTML::FormHandler::Page::Simple - used by Wizard
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -45,7 +45,7 @@ HTML::FormHandler::Page - used in Wizard
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -76,7 +76,7 @@ HTML::FormHandler::Pages - used in Wizard
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -134,7 +134,7 @@ HTML::FormHandler::Params - params handling
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -340,7 +340,7 @@ HTML::FormHandler::Render::Simple - simple rendering role
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -80,7 +80,7 @@ HTML::FormHandler::Render::Table - render a form with a table layout
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -91,7 +91,7 @@ HTML::FormHandler::Render::WithTT - tt rendering
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -97,7 +97,7 @@ HTML::FormHandler::Result::Role - role with common code for form & field results
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -72,7 +72,7 @@ HTML::FormHandler::Result - form result object
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -51,7 +51,7 @@ HTML::FormHandler::TraitFor::Captcha - generate and validate captchas
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -42,7 +42,7 @@ HTML::FormHandler::TraitFor::I18N - localization
=head1 VERSION
-version 0.33002
+version 0.34001
=head3 language_handle, _build_language_handle
@@ -116,7 +116,7 @@ HTML::FormHandler::Traits - customized replacement for MooseX::Traits
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -171,7 +171,7 @@ HTML::FormHandler::Types - Moose type constraints
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -235,7 +235,7 @@ HTML::FormHandler::Validate - validation role (internal)
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -60,7 +60,7 @@ HTML::FormHandler::Widget::ApplyRole - role to apply widgets
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -15,7 +15,7 @@ sub render {
my $output = '<input type="button" name="';
$output .= $self->html_name . '"';
$output .= ' id="' . $self->id . '"';
- $output .= ' value="' . $self->html_filter($self->value) . '"';
+ $output .= ' value="' . $self->html_filter($self->_localize($self->value)) . '"';
$output .= $self->_add_html_attributes;
$output .= ' />';
return $self->wrap_field( $result, $output );
@@ -32,7 +32,7 @@ HTML::FormHandler::Widget::Field::Button - button field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -33,7 +33,7 @@ HTML::FormHandler::Widget::Field::Checkbox - HTML attributes field role
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -57,7 +57,7 @@ HTML::FormHandler::Widget::Field::CheckboxGroup - checkbox group field role
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -34,7 +34,7 @@ HTML::FormHandler::Widget::Field::Compound - compound field widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -31,7 +31,7 @@ HTML::FormHandler::Widget::Field::Hidden - hidden field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -17,7 +17,7 @@ HTML::FormHandler::Widget::Field::NoRender - no rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -32,7 +32,7 @@ HTML::FormHandler::Widget::Field::Password - password rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -37,7 +37,7 @@ HTML::FormHandler::Widget::Field::RadioGroup - radio group rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -28,7 +28,7 @@ HTML::FormHandler::Widget::Field::Repeatable - repeatable field widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -32,7 +32,7 @@ HTML::FormHandler::Widget::Field::Reset - reset field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -28,7 +28,7 @@ HTML::FormHandler::Widget::Field::Role::HTMLAttributes - apply HTML attributes
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -29,7 +29,7 @@ HTML::FormHandler::Widget::Field::Role::SelectedOption - allow setting options f
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -72,7 +72,7 @@ HTML::FormHandler::Widget::Field::Select - select field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -32,7 +32,7 @@ HTML::FormHandler::Widget::Field::Submit - submit field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -34,7 +34,7 @@ HTML::FormHandler::Widget::Field::Text - text field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -34,7 +34,7 @@ HTML::FormHandler::Widget::Field::Textarea - textarea rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -29,7 +29,7 @@ HTML::FormHandler::Widget::Field::Upload - update field rendering widget
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -38,7 +38,7 @@ HTML::FormHandler::Widget::Form::Role::HTMLAttributes - set HTML attributes on t
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -78,7 +78,7 @@ HTML::FormHandler::Widget::Form::Simple - widget to render a form with divs
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -42,7 +42,7 @@ HTML::FormHandler::Widget::Form::Table - render a form with a table layout
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -36,7 +36,7 @@ HTML::FormHandler::Widget::Wrapper::Base - commong methods for widget wrappers
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -33,7 +33,7 @@ HTML::FormHandler::Widget::Wrapper::Fieldset - fieldset field wrapper
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -17,7 +17,7 @@ HTML::FormHandler::Widget::Wrapper::None - wrapper that doesn't wrap
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -7,6 +7,8 @@ use namespace::autoclean;
with 'HTML::FormHandler::Widget::Wrapper::Base';
+has 'auto_fieldset' => ( isa => 'Bool', is => 'rw', lazy => 1, default => 1 );
+
sub wrap_field {
my ( $self, $result, $rendered_widget ) = @_;
my $t;
@@ -20,8 +22,10 @@ sub wrap_field {
$output .= $start_tag;
if ( $is_compound ) {
- $output .= '<fieldset class="' . $self->html_name . '">';
- $output .= '<legend>' . $self->loc_label . '</legend>';
+ if( $self->auto_fieldset ) {
+ $output .= '<fieldset class="' . $self->html_name . '">';
+ $output .= '<legend>' . $self->loc_label . '</legend>';
+ }
}
elsif ( !$self->has_flag('no_render_label') && length( $self->label ) > 0 ) {
$output .= $self->render_label;
@@ -31,7 +35,7 @@ sub wrap_field {
$output .= qq{\n<span class="error_message">$_</span>}
for $result->all_errors;
$output .= '</fieldset>'
- if $is_compound;
+ if ( $is_compound && $self->auto_fieldset );
$output .= defined($t = $self->get_tag('wrapper_end')) ? $t : '</div>';
@@ -49,7 +53,7 @@ HTML::FormHandler::Widget::Wrapper::Simple - simple field wrapper
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -0,0 +1,69 @@
+package HTML::FormHandler::Widget::Wrapper::SimpleInline;
+# ABSTRACT: simple field wrapper
+
+use Moose::Role;
+use namespace::autoclean;
+
+with 'HTML::FormHandler::Widget::Wrapper::Base';
+
+
+has 'auto_fieldset' => ( isa => 'Bool', is => 'rw', lazy => 1, default => 1 );
+
+sub wrap_field {
+ my ( $self, $result, $rendered_widget ) = @_;
+
+ return $rendered_widget if $self->has_flag('is_compound');
+
+ my $t;
+ my $output = '';
+ my $start_tag = defined($t = $self->get_tag('wrapper_start')) ?
+ $t : '<div<%class%>>';
+ my $class = $self->render_class($result);
+ $output .= "\n";
+ $start_tag =~ s/<%class%>/$class/g;
+ $output .= $start_tag;
+
+ if ( !$self->has_flag('no_render_label') && length( $self->label ) > 0 ) {
+ $output .= $self->render_label;
+ }
+
+ $output .= $rendered_widget;
+ $output .= qq{\n<span class="error_message">$_</span>}
+ for $result->all_errors;
+
+ $output .= defined($t = $self->get_tag('wrapper_end')) ? $t : '</div>';
+
+ return "$output\n";
+}
+
+1;
+
+__END__
+=pod
+
+=head1 NAME
+
+HTML::FormHandler::Widget::Wrapper::SimpleInline - simple field wrapper
+
+=head1 VERSION
+
+version 0.34001
+
+=head1 SYNOPSIS
+
+This works like the Simple Wrapper, except it doesn't wrap Compound
+fields.
+
+=head1 AUTHOR
+
+FormHandler Contributors - see HTML::FormHandler
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2010 by Gerda Shank.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
+
@@ -38,7 +38,7 @@ HTML::FormHandler::Widget::Wrapper::Table - wrapper class for table layout
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 AUTHOR
@@ -0,0 +1,51 @@
+package HTML::FormHandler::Widget::Wrapper::TableInline;
+# ABSTRACT: wrapper class for table layout that doesn't wrap compound fields
+
+use Moose::Role;
+with 'HTML::FormHandler::Widget::Wrapper::Base';
+
+sub wrap_field {
+ my ( $self, $result, $rendered_widget ) = @_;
+
+ return $rendered_widget if $self->has_flag('is_compound');
+
+ my $class = $self->render_class($result);
+ my $output = "\n<tr$class>";
+ if ( !$self->has_flag('no_render_label') && length( $self->label ) > 0 ) {
+ $output .= '<td>' . $self->render_label . '</td>';
+ }
+ $output .= '<td>';
+ $output .= $rendered_widget;
+ $output .= qq{\n<span class="error_message">$_</span>} for $result->all_errors;
+ $output .= "</td></tr>\n";
+
+ return $output;
+}
+
+use namespace::autoclean;
+1;
+
+__END__
+=pod
+
+=head1 NAME
+
+HTML::FormHandler::Widget::Wrapper::TableInline - wrapper class for table layout that doesn't wrap compound fields
+
+=head1 VERSION
+
+version 0.34001
+
+=head1 AUTHOR
+
+FormHandler Contributors - see HTML::FormHandler
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2010 by Gerda Shank.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
+
@@ -108,7 +108,7 @@ HTML::FormHandler::Wizard - create a multi-page form
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -19,24 +19,19 @@ use Try::Tiny;
use 5.008;
# always use 5 digits after decimal because of toolchain issues
-our $VERSION = '0.33002';
+our $VERSION = '0.34001';
+# for consistency in api with field nodes
+sub form { shift }
+sub has_form { 1 }
+
# Moose attributes
has 'name' => (
isa => 'Str',
is => 'rw',
default => sub { return 'form' . int( rand 1000 ) }
);
-# for consistency in api with field nodes
-has 'form' => (
- isa => 'HTML::FormHandler',
- is => 'rw',
- weak_ref => 1,
- predicate => 'has_form',
- lazy => 1,
- default => sub { shift }
-);
has 'parent' => ( is => 'rw' );
has 'result' => (
isa => 'HTML::FormHandler::Result',
@@ -576,7 +571,7 @@ HTML::FormHandler - HTML forms using Moose
=head1 VERSION
-version 0.33002
+version 0.34001
=head1 SYNOPSIS
@@ -0,0 +1,49 @@
+use strict;
+use warnings;
+use Test::More;
+use Test::Memory::Cycle;
+
+{
+ package My::RepeatableForm;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has '+name' => ( default => 'testform' );
+ has_field 'reqname' => ( required => 1 );
+ has_field 'entries' => (
+ type => 'Repeatable',
+ required => 1,
+ required_message => 'Request without entries not accepted'
+ );
+ has_field 'entries.rule_index' => ( type => 'PrimaryKey' );
+ has_field 'entries.foo' => (
+ type => 'Text',
+ required => 1,
+ );
+ has_field 'entries.bar' => (
+ type => 'Text',
+ required => 1,
+ );
+ has_field 'some_select' => ( type => 'Select', inactive => 1 );
+
+ sub update_model {
+ my $self = shift;
+ my $value = $self->field('some_select')->value;
+ }
+}
+
+my $form = new_ok( 'My::RepeatableForm' );
+
+my $params = {
+ reqname => 'Testrequest',
+ 'entries.1.foo' => 'test1',
+ 'entries.1.bar' => 'test1',
+ 'entries.2.foo' => 'test2',
+ 'entries.2.bar' => 'test2',
+};
+memory_cycle_ok( $form, 'form has no memory cycles before process' );
+ok( $form->process( params => $params ), 'form processed ok' );
+memory_cycle_ok( $form, 'form has no memory cycles after process' );
+
+done_testing;
+
@@ -3,6 +3,8 @@ use warnings;
use Test::More;
use_ok( 'HTML::FormHandler' );
+use HTML::FormHandler::I18N;
+$ENV{LANGUAGE_HANDLE} = HTML::FormHandler::I18N->get_handle('en_en');
{
package My::Form;
@@ -81,5 +81,35 @@ is( $form->field('baz')->html, "<h2>Pick something, quick!</h2>", 'new method wo
is( $form->field('foo')->widget_attr, 'A Test!', 'widget attribute applied' );
is( $form->field('foo')->render, 'A Test!', 'widget renders using attribute' );
+# the following test show that with application of a role to create
+# a field method 'id', you can have dynamically changed form names
+{
+ package My::FieldId;
+ use Moose::Role;
+ around 'id' => sub {
+ my $orig = shift;
+ my $self = shift;
+ my $form_name = $self->form->name;
+ return $form_name . "." . $self->full_name;
+ };
+}
+
+{
+ package My::CustomIdForm;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has '+html_prefix' => ( default => 1 );
+ has '+field_traits' => ( default => sub { ['My::FieldId'] } );
+
+ has_field 'foo';
+ has_field 'bar';
+}
+
+$form = My::CustomIdForm->new;
+$form->process( name => 'Form123', params => {} );
+is( $form->field('foo')->id, 'Form123.foo', 'right field id' );
+$form->process( name => 'Form456', params => {} );
+is( $form->field('foo')->id, 'Form456.foo', 'right field id again' );
done_testing;
@@ -165,4 +165,33 @@ is_deeply( $form->fif, { my_list => 2 }, 'fif is correct' );
$rendered_field = $form->field('my_list')->render;
like( $rendered_field, qr/<option value="2" id="my_list\.1" selected="selected">/, 'element is selected' );
+# following test is for 'has_many' select field flag
+{
+ package Test::HasMany;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has_field 'foo' => ( default => 'my_foo' );
+ has_field 'hm_bar' => ( type => 'Multiple',
+ has_many => 'my_id', default => [3] );
+
+ sub options_hm_bar { [1, 2, 3, 4] }
+}
+$form = Test::HasMany->new;
+ok( $form, 'has many form built' );
+$form->process( params => {} );
+my $fif_expected = { foo => 'my_foo', hm_bar => [3] };
+is_deeply( $form->fif, $fif_expected, 'got expected fif' );
+$form->process( params => { foo => 'my_foo', hm_bar => [4] } );
+my $val_expected = { foo => 'my_foo', hm_bar => [ { my_id => 4 } ] };
+is_deeply( $form->value, $val_expected, 'got expected value' );
+$fif_expected = { foo => 'my_foo', hm_bar => [4] };
+is_deeply( $form->fif, $fif_expected, 'got expected fif' );
+$form->process( params => { foo => 'my_foo', hm_bar => [1,2] } );
+$fif_expected = { foo => 'my_foo', hm_bar => [1,2] };
+is_deeply( $form->fif, $fif_expected, 'got expected fif again' );
+$val_expected = { foo => 'my_foo', hm_bar => [ { my_id => 1 }, { my_id => 2 } ] };
+is_deeply( $form->value, $val_expected, 'got expected value agina' );
+
+
done_testing;
@@ -381,4 +381,36 @@ is( $form->field('baz')->render, '
<label class="label" for="baz">Baz: </label><input type="text" name="baz" id="baz" value="" />
', 'field renders with empty widget_tags' );
+{
+ package Test::Rendering;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has_field 'my_comp' => ( type => 'Compound', widget_wrapper => 'SimpleInline' );
+ has_field 'my_comp.one';
+ has_field 'my_comp.two';
+ has_field 'my_alt' => ( type => 'Compound', widget_wrapper => 'TableInline' );
+ has_field 'my_alt.one' => ( widget_wrapper => 'TableInline' );
+ has_field 'my_alt.two' => ( widget_wrapper => 'TableInline' );;
+
+}
+
+$form = Test::Rendering->new;
+my $expected = '
+<div><label class="label" for="my_comp.one">One: </label><input type="text" name="my_comp.one" id="my_comp.one" value="" /></div>
+
+<div><label class="label" for="my_comp.two">Two: </label><input type="text" name="my_comp.two" id="my_comp.two" value="" /></div>
+';
+my $out = $form->field('my_comp')->render;
+is( $out, $expected, 'compound field with inline wrapper' );
+
+is( $form->field('my_alt')->widget_wrapper, 'TableInline', 'widget wrapper works' );
+$expected = '
+<tr><td><label class="label" for="my_alt.one">One: </label></td><td><input type="text" name="my_alt.one" id="my_alt.one" value="" /></td></tr>
+
+<tr><td><label class="label" for="my_alt.two">Two: </label></td><td><input type="text" name="my_alt.two" id="my_alt.two" value="" /></td></tr>
+';
+$out = $form->field('my_alt')->render;
+is( $out, $expected, 'compound field with table inline wrapper' );
+
done_testing;
@@ -0,0 +1,215 @@
+use strict;
+use warnings;
+use Test::More;
+
+# This test uses roles to create forms and fields
+# and nests the repeatables
+
+{
+ package Test::Form::Role::Employee;
+ use HTML::FormHandler::Moose::Role;
+
+ has_field 'first_name';
+ has_field 'last_name';
+ has_field 'email';
+ has_field 'password';
+}
+
+{
+ package Test::Form::Employee;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ with 'Test::Form::Role::Employee';
+}
+
+{
+ package Test::Form::Field::Employee;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler::Field::Compound';
+
+ has_field 'id' => ( type => 'PrimaryKey' );
+ with 'Test::Form::Role::Employee';
+}
+
+{
+ package Test::Form::Role::Office;
+ use HTML::FormHandler::Moose::Role;
+
+ has_field 'address';
+ has_field 'city';
+ has_field 'state';
+ has_field 'zip';
+ has_field 'phone';
+ has_field 'fax';
+ has_field 'employees' => ( type => 'Repeatable' );
+ has_field 'employees.contains' => ( type => '+Test::Form::Field::Employee' );
+
+}
+
+{
+ package Test::Form::Field::Office;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler::Field::Compound';
+
+ has_field 'id' => ( type => 'PrimaryKey' );
+ with 'Test::Form::Role::Office';
+
+}
+
+{
+ package Test::Form::Office;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+ with 'Test::Form::Role::Office';
+
+}
+
+{
+ package Test::Form::Company;
+
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+
+ has '+item_class' => (
+ default => 'Company'
+ );
+
+ has_field 'name';
+ has_field 'username';
+ has_field 'tier';
+ has_field 'type';
+
+ has_field 'offices' => ( type => 'Repeatable' );
+ has_field 'offices.contains' => ( type => '+Test::Form::Field::Office' );
+
+}
+
+my $field = Test::Form::Field::Employee->new( name => 'test_employee' );
+ok( $field, 'field created' );
+is( $field->num_fields, 5, 'right number of fields' );
+
+my $form = Test::Form::Company->new;
+my $params = {
+ name => 'my_name',
+ username => 'a_user',
+ tier => 1,
+ type => 'simple',
+ offices => [
+ {
+ id => 1,
+ address => '101 Main St',
+ city => 'Smallville',
+ state => 'CA',
+ employees => [
+ {
+ id => 1,
+ first_name => 'John',
+ last_name => 'Doe',
+ email => 'jdoe@gmail.com',
+ }
+ ]
+ },
+ ]
+};
+$form->process( params => $params );
+ok( $form, 'form built' );
+my $fif = $form->fif;
+my $value = $form->value;
+my $expected = {
+ 'name' => 'my_name',
+ 'offices.0.address' => '101 Main St',
+ 'offices.0.city' => 'Smallville',
+ 'offices.0.employees.0.email' => 'jdoe@gmail.com',
+ 'offices.0.employees.0.first_name' => 'John',
+ 'offices.0.employees.0.id' => 1,
+ 'offices.0.employees.0.last_name' => 'Doe',
+ 'offices.0.employees.0.password' => '',
+ 'offices.0.fax' => '',
+ 'offices.0.id' => 1,
+ 'offices.0.phone' => '',
+ 'offices.0.state' => 'CA',
+ 'offices.0.zip' => '',
+ 'tier' => 1,
+ 'type' => 'simple',
+ 'username' => 'a_user',
+};
+is_deeply( $fif, $expected, 'fif is correct' );
+is_deeply( $value, $params, 'value is correct' );
+
+# following takes some pieces of above tests and tests using
+# a Repeatable subclass
+{
+
+{
+ package Test::Form::Field::RepEmployee;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler::Field::Repeatable';
+
+ has_field 'id' => ( type => 'PrimaryKey' );
+ with 'Test::Form::Role::Employee';
+}
+
+{
+ package Test::Form::Role::RepOffice;
+ use HTML::FormHandler::Moose::Role;
+
+ has_field 'address';
+ has_field 'city';
+ has_field 'state';
+ has_field 'zip';
+ has_field 'phone';
+ has_field 'fax';
+ has_field 'employees' => ( type => '+Test::Form::Field::RepEmployee' );
+
+}
+
+{
+ package Test::Form::RepOffice;
+ use HTML::FormHandler::Moose;
+ extends 'HTML::FormHandler';
+ with 'Test::Form::Role::RepOffice';
+
+}
+
+my $field = Test::Form::Field::RepEmployee->new( name => 'test_employee' );
+ok( $field, 'field created' );
+is( $field->num_fields, 5, 'right number of fields' );
+
+my $form = Test::Form::RepOffice->new;
+my $params = {
+ address => '101 Main St',
+ city => 'Smallville',
+ state => 'CA',
+ employees => [
+ {
+ id => 1,
+ first_name => 'John',
+ last_name => 'Doe',
+ email => 'jdoe@gmail.com',
+ }
+ ]
+};
+$form->process( params => $params );
+ok( $form, 'form built' );
+my $fif = $form->fif;
+my $value = $form->value;
+my $expected = {
+ 'address' => '101 Main St',
+ 'city' => 'Smallville',
+ 'employees.0.email' => 'jdoe@gmail.com',
+ 'employees.0.first_name' => 'John',
+ 'employees.0.id' => 1,
+ 'employees.0.last_name' => 'Doe',
+ 'employees.0.password' => '',
+ 'fax' => '',
+ 'phone' => '',
+ 'state' => 'CA',
+ 'zip' => '',
+};
+is_deeply( $fif, $expected, 'fif is correct' );
+is_deeply( $value, $params, 'value is correct' );
+
+}
+
+done_testing;